package ve.usb.crm;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.hibernate.Hibernate;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.crm.hibernate.*;


/**
 *
 */
public class AccionesPapelera extends CohesionAction {

/**
     * Called by Struts for the execution of action APreCategorias.
     *
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions.
     * These exceptios will normally be treated with
     * the default exception action.
     */
    public ActionForward APrePapelera(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"VPapelera", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            List<Cuenta> listCuenta = new ArrayList<Cuenta>();
            if (CohesionActor.checkActor(request, CohesionActor.ACTOR_administrador)) {
                listCuenta = (List<Cuenta>) s.createQuery("from Cuenta where esactivo = false").list();
            } else if (CohesionActor.checkActor(request, CohesionActor.ACTOR_empleado)) {
                Personal usuario = (Personal) request.getSession().getAttribute("Usuario");

                listCuenta = (List<Cuenta>) s.createQuery("from Cuenta where"
                        + " respCuenta = :usuario and esactivo = true").setLong("usuario", usuario.getIdPersonal()).list();
            }

            for (Cuenta c : listCuenta) {
                c.getRespCuenta().getNombre();
                c.getRespCuenta().getApellido();
            }
            request.setAttribute("L_Cuenta", listCuenta);

            //Saco la lista de todos los contactos
            List<Contacto> listContacto = new ArrayList<Contacto>();
            if (CohesionActor.checkActor(request, CohesionActor.ACTOR_administrador)) {
                listContacto = (List<Contacto>) s.createQuery("from Contacto where esCLiente = :bool and esActivo = false").setBoolean("bool", false).list();
            } else if (CohesionActor.checkActor(request, CohesionActor.ACTOR_empleado)) {
                Personal usuario = (Personal) request.getSession().getAttribute("Usuario");
                listContacto = (List<Contacto>) s.createQuery("from Contacto where" +
                        " esCLiente = :bool and persona = :usuario and esActivo = true")
                        .setLong("usuario", usuario.getIdPersonal()).setBoolean("bool", false).list();
            }

            //Obtengo el valor cuenta de cada uno de los contactos
            for (Iterator<Contacto> itContacto = listContacto.iterator(); itContacto.hasNext();) {
                Contacto contacto = itContacto.next();
                Hibernate.initialize(contacto.getCuenta());
                Hibernate.initialize(contacto.getContactoUsuario());
            }

            //Subo el atributo al request
            request.setAttribute("L_Contacto", listContacto);

            List<Contacto> listCliente = new ArrayList<Contacto>();
            if (CohesionActor.checkActor(request, CohesionActor.ACTOR_administrador)) {
                listCliente = (List<Contacto>) s.createQuery("from Contacto where esCLiente = :bool and esActivo = false").setBoolean("bool", true).list();
            } else if (CohesionActor.checkActor(request, CohesionActor.ACTOR_empleado)) {
                Personal usuario = (Personal) request.getSession().getAttribute("Usuario");
                listCliente = (List<Contacto>) s.createQuery("from Contacto where"
                        + " esCLiente = :bool and persona = :usuario").setLong("usuario", usuario.getIdPersonal()).setBoolean("bool", true).list();
            }

            //Obtengo el valor cuenta de cada uno de los contactos
            for (Iterator<Contacto> itCliente = listCliente.iterator(); itCliente.hasNext();) {
                Contacto contacto = itCliente.next();
                Hibernate.initialize(contacto.getPersona());
                Hibernate.initialize(contacto.getCuenta());
            }

            //Subo el atributo al request
            request.setAttribute("L_Cliente", listCliente);

            // Saco las oportunidades con sus cuentas asociadas para ser mostradas

            List<Oportunidad> oportunidad = (List<Oportunidad>) s.createQuery("from Oportunidad where esActivo = false and concretado = false").list();
            for (Oportunidad op : oportunidad) {
                Cuenta cu = (Cuenta) s.load(Cuenta.class, op.getCuenta().getIdCuenta());
                cu.getIdCuenta();
                cu.getNombre();
                op.getRespOportunidad().getNombre();
                op.getRespOportunidad().getApellido();
            }
            request.setAttribute("L_Oportunidad", oportunidad);

            List<Proyecto> proyectos = (List<Proyecto>) s.createQuery("from Proyecto where esActivo = false").list();


            for (Proyecto p : proyectos) {
                Hibernate.initialize(p.getCuenta());
                Hibernate.initialize(p.getRespProyecto().getNombre());
            }

            request.setAttribute("L_Proyecto", proyectos);

            List<Tarea> tareas = (List<Tarea>) s.createQuery("from Tarea where esActivo = false").list();

            for (Tarea l: tareas) {
                if (l.getCuentaRelacionada() != null)
                    Hibernate.initialize(l.getCuentaRelacionada().getNombre());
                if (l.getContactoRelacionado() != null)
                    Hibernate.initialize(l.getContactoRelacionado().getNombre());

                Hibernate.initialize(l.getPersonal().getNombre());
                Hibernate.initialize(l.getPersonal().getApellido());
            }

            request.setAttribute("L_Tarea", tareas);

            List<Personal> list = (List<Personal>) s.createQuery("from Personal where esActivo = false").list();
            for (Iterator<Personal> it = list.iterator(); it.hasNext();) {
                Personal personal = it.next();
                Hibernate.initialize(personal.getPersonalUsuario());

            }

            request.setAttribute("L_Personal", list);
            
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action APreCrearCategoria.
     *
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions.
     * These exceptios will normally be treated with
     * the default exception action.
     */
    public ActionForward ARestaurarPapelera(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APrePapelera", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {

            Long idCuenta = lookup_Long(request, "idCuenta");
            Long idContacto = lookup_Long(request,"idContacto");
            Long idCliente = lookup_Long(request,"idCliente");
            Long idOportunidad = lookup_Long(request,"idOportunidad");
            Long idProyecto = lookup_Long(request,"idProyecto");
            Long idTarea = lookup_Long(request,"idTarea");
            Long idUsuario = lookup_Long(request, "idUsuario");
            
           if (idCuenta != null) {
                Cuenta cuenta = (Cuenta) s.load(Cuenta.class, idCuenta);

                List<Oportunidad> oportunidad = (List<Oportunidad>) s.createQuery("from Oportunidad where cuenta = :resp and esActivo = false").setLong("resp", idCuenta).list();
                for (Oportunidad t : oportunidad) {
                    t.setEsActivo(true);
                    s.update(t);
                    s.flush();
                    List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where oportunidadrelacionada = :resp and esActivo = false").setLong("resp", t.getIdOportunidad()).list();
                    for (Tarea tar : tarea) {
                        tar.setEsActivo(true);
                        s.update(tar);
                        s.flush();
                    }
                }

                List<Proyecto> proyecto = (List<Proyecto>) s.createQuery("from Proyecto where cuenta = :resp and esActivo = false").setLong("resp", idCuenta).list();
                for (Proyecto t : proyecto) {
                    t.setEsActivo(true);
                    s.update(t);
                    s.flush();
                }

                List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where cuentarelacionada = :resp and esActivo = false").setLong("resp", idCuenta).list();
                for (Tarea t : tarea) {
                    t.setEsActivo(true);
                    s.update(t);
                    s.flush();
                }

                cuenta.setEsActivo(true);
                s.update(cuenta);
                s.flush();
            } else if (idContacto != null) {
                Contacto contacto = (Contacto) s.load(Contacto.class, idContacto);

                List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where contactorelacionado = :resp and esActivo = false").setLong("resp", idContacto).list();
                for (Tarea t : tarea) {
                    t.setEsActivo(true);
                    s.update(t);
                    s.flush();
                }
                contacto.setEsActivo(true);
                s.update(contacto);
                s.flush();
            } else if (idCliente != null) {
                Contacto cliente = (Contacto) s.load(Contacto.class, idCliente);

                cliente.setEsActivo(true);
                s.update(cliente);
                s.flush();

            } else if (idOportunidad != null) {
                List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where oportunidadrelacionada = :resp and esActivo = false").setLong("resp", idOportunidad).list();
                for (Tarea t : tarea) {
                    t.setEsActivo(true);
                    s.update(t);
                    s.flush();
                }
                Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, idOportunidad);
                oportunidad.setEsActivo(true);
                s.update(oportunidad);
                s.flush();
            } else if (idProyecto != null) {
                Proyecto proyecto = (Proyecto) s.load(Proyecto.class, idProyecto);
                proyecto.setEsActivo(true);
                s.update(proyecto);
                s.flush();
            } else if (idTarea != null) {
                Tarea tarea = (Tarea) s.load(Tarea.class, idTarea);

                tarea.setEsActivo(true);
                s.update(tarea);
            } else if (idUsuario != null) {
                Personal personal = (Personal) s.load(Personal.class, idUsuario);

                personal.setEsActivo(true);
                s.save(personal);
            }


            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action ACrearCategoria.
     *
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions.
     * These exceptios will normally be treated with
     * the default exception action.
     */
    public ActionForward AEliminarPapelera(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"APrePapelera", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            if (!request.getParameter("idCuenta").equals(null)) {
                Long idCuenta = new Long(request.getParameter("idCuenta"));
                Cuenta cuenta = (Cuenta) s.load(Cuenta.class, idCuenta);

                List<Oportunidad> oportunidad = (List<Oportunidad>) s.createQuery("from Oportunidad where cuenta = :resp and esActivo = false").setLong("resp", idCuenta).list();
                for (Oportunidad t : oportunidad) {
                    List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where oportunidadrelacionada = :resp and esActivo = false").setLong("resp", t.getIdOportunidad()).list();
                    for (Tarea tar : tarea) {
                        s.delete(tar);
                        s.flush();
                    }
                    s.delete(t);
                    s.flush();
                    
                }

                List<Proyecto> proyecto = (List<Proyecto>) s.createQuery("from Proyecto where cuenta = :resp and esActivo = false").setLong("resp", idCuenta).list();
                for (Proyecto t : proyecto) {
                    s.delete(t);
                    s.flush();
                }

                List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where cuentarelacionada = :resp and esActivo = false").setLong("resp", idCuenta).list();
                for (Tarea t : tarea) {
                    s.delete(t);
                    s.flush();
                }

                s.delete(cuenta);
                s.flush();
            } else if (!request.getParameter("idContacto").equals(null)) {
                 Long idContacto = new Long(request.getParameter("idContacto"));
                Contacto contacto = (Contacto) s.load(Contacto.class, idContacto);

                List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where contactorelacionado = :resp and esActivo = false").setLong("resp", idContacto).list();
                for (Tarea t : tarea) {
                    s.delete(t);
                    s.flush();
                }
                s.delete(contacto);
                s.flush();
            } else if (!request.getParameter("idCliente").equals(null)) {
                Long idCliente = new Long(request.getParameter("idCliente"));
                Contacto cliente = (Contacto) s.load(Contacto.class, idCliente);

                s.delete(cliente);
                s.flush();

            } else if (!request.getParameter("idOportunidad").equals(null)) {
                Long idOportunidad = new Long(request.getParameter("idOportunidad"));
                List<Tarea> tarea = (List<Tarea>) s.createQuery("from Tarea where oportunidadrelacionada = :resp and esActivo = false").setLong("resp", idOportunidad).list();
                for (Tarea t : tarea) {
                    s.delete(t);
                    s.flush();
                }
                Oportunidad oportunidad = (Oportunidad) s.load(Oportunidad.class, idOportunidad);
                s.delete(oportunidad);
                s.flush();
            } else if (!request.getParameter("idProyecto").equals(null)) {
                Long idProyecto = new Long(request.getParameter("idProyecto"));
                Proyecto proyecto = (Proyecto) s.load(Proyecto.class, idProyecto);
                s.delete(proyecto);
                s.flush();
            } else if (!request.getParameter("idTarea").equals(null)) {
                Long idTarea = new Long(request.getParameter("idTarea"));
                Tarea tarea = (Tarea) s.load(Tarea.class, idTarea);
                s.delete(tarea);
                s.flush();
            }
            
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }
}